#pragma once
#include"Command.hpp"


class InetAddr
{
public:
    InetAddr(){};
    //网络转主机
    InetAddr(struct sockaddr_in addr)
    :_addr(addr)
    {
        _port = ntohs(_addr.sin_port);           // 从网络中拿到的！网络序列
         // _ip = inet_ntoa(_addr.sin_addr); // 4字节网络风格的IP -> 点分十进制的字符串风格的IP
        char ipbuffer[64];
        inet_ntop(AF_INET, &_addr.sin_addr, ipbuffer, sizeof(addr));
        _ip = ipbuffer;
    }

   //主机转网络
   InetAddr(const std::string ip,uint16_t port)
   :_ip(ip)
   ,_port(port)
   {
        memset(&_addr, 0, sizeof(_addr));
        _addr.sin_family = AF_INET;
        inet_pton(AF_INET, _ip.c_str(), &_addr.sin_addr);
        _addr.sin_port = htons(_port);
        //_addr.sin_addr.s_addr=inet_addr(_ip.c_str());

   }
    InetAddr(uint16_t port)
    :_port(port)
   {
        memset(&_addr, 0, sizeof(_addr));
        _addr.sin_family = AF_INET;
       _addr.sin_addr.s_addr=INADDR_ANY;
        _addr.sin_port = htons(_port);
        //_addr.sin_addr.s_addr=inet_addr(_ip.c_str());

   }
    uint16_t Port(){return _port;}

    std::string Ip(){return _ip;}

    struct sockaddr_in& NetAddr(){return _addr;}
    const struct sockaddr* NetAddrPtr()
    {
        return CONV(_addr);
    }
    socklen_t NetLen()
    {
        return sizeof(_addr);
    }
    void SetAddr(struct sockaddr_in addr)
    {
        _addr=addr;
        _port = ntohs(_addr.sin_port);           // 从网络中拿到的！网络序列
         // _ip = inet_ntoa(_addr.sin_addr); // 4字节网络风格的IP -> 点分十进制的字符串风格的IP
        char ipbuffer[64];
        inet_ntop(AF_INET, &_addr.sin_addr, ipbuffer, sizeof(addr));
        _ip = ipbuffer;
    }

    socklen_t Len(){ return sizeof(_addr);}
    
    std::string StringAddr(){ return _ip+":"+std::to_string(_port);}

 
    bool operator==(const InetAddr& addr)
    {
        return addr._ip==_ip && addr._port==_port; 
    }
    ~InetAddr(){};
private:
    struct sockaddr_in _addr;
    std::string _ip;
    uint16_t _port;

};